package com.example.wan1.base;

import android.content.Context;
import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

/***
 * 创建时间：2020/4/26 20:28
 * 创建人：10850
 * 功能描述：思考下BasePresenter是否应该具有view和model的引用？还是只是持有view的引用？哪个好？
 *
 * 1.提取到基类，使用的是模板模式 https://blog.csdn.net/smile_Running/article/details/88778488
 * 2.MVP主要的是P和V的绑定与解绑，这期间会遇到哪些问题？怎么解决？
 * 内存泄漏
 * 3.在抽取的时候 泛型的使用也尤为重要
 *
 * 4.多个 Presenter 依赖注入.比如登录注册的界面放到一起，就要实现两个presenter和view。如果设置碎片也可能出现继承多个view和presenter的情况,其他的似乎很少见
 * 因为 Presenter 的实例化是在 Activity 中进行的，所以我们得从 BaseActivity 中入手。
 * 我们只有一个目的：就是实例化不同的 Presenter 实现类。在泛型的类型面前，我们只能做的也就是通过反射来实例化。
 *
 * 测试:再创建一个presenter和model，返回查询的条数.
 * 经过测试发现是可以的，只要注入另外一个presenter，然后实现契约接口中的view接口即可
 *
 * 5.使用反射后虽然可以不用实例化presenter，但是BaseActivity和BaseFragment都会产生相同的注解的反射代码，即重复的代码，这个该如何处理？
 * 通过静态代理的方式抽取重复的代码，放到一个类中来处理这些逻辑
 * 步骤：代理接口-->代理实现类（将公共的逻辑放到里面）-->Activity和fragment的实现类，在BaseMvpActivity、BaseMvpFragment中直接使用bind和Unbing就可以了
 *
 * 6.使用多个presenter的时候是这样子的public class MainActivity extends BaseMvpActivity<LookPresenter> implements LoginContract.View, LookContract.View
 * 通过注入两个presenter生效的，这里能不能不去继承带泛型的Activity，只实现view的接口和注入Presenter实例？
 * public abstract class BaseMvpActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView {改成
 * public abstract class BaseMvpActivity extends AppCompatActivity implements IBaseView {
 *
 * 其BaseMvpActivity的子类就不需要public class MainActivity extends BaseMvpActivity<LookPresenter> implements LoginContract.View, LookContract.View {
 * 改成这样
 * public class MainActivity extends BaseMvpActivity implements LoginContract.View, LookContract.View {
 *
 * 7.能不能使用工厂模式来实现静态代理，实现绑定和解绑view的操作？
 * 这里用不到。只需要接口抽取出来，弄一个实现类就行
 * （1）发现ProxyActivity和ProxyFragment是多余的.todo .. 不知道是不是因为静态代理必须写这两个类
 * （2）
 *
 * 代理+反射+泛型
 *
 */
@SuppressWarnings("unchecked")
public abstract class BaseMvpActivity extends AppCompatActivity implements IBaseView {

    private ProxyImpl mProxyActivity;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //第五步
        mProxyActivity = createProxyActivity();

        mProxyActivity.bindPresenter();

    }

    private ProxyImpl createProxyActivity() {
        if (mProxyActivity == null) {
            return new ProxyImpl(this);
        }
        return mProxyActivity;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        mProxyActivity.unBindPresenter();
    }

    @Override
    public Context getContext() {
        return this;
    }

}

